#!/bin/sh
# the next line restarts using wish \
exec wish "$0" "$@"

# Variables

# Type de fichiers à filtrer
set file_types ""    

listbox .lst 

#Procedure de mise à jour du nom du chemin courant d'une fenetre d'exploration
proc compiler {} {
	global filename pipe_my_loop

	if { $filename == "" } {
       # Affichage d'un message d'erreur dans le cas où le nom du fichier est incorrect
       tk_messageBox -title "Erreur compilation " -icon error -message "Vous n'avez pas ouvert de programme Pascal.\nCompilation impossible."
       return
    } else {
    	set compteur 0
		set filePCod [open "$filename.pcod" r]
		set textPCod [read $filePCod]
		#fermeture
		close $filePCod
		#si le PCod est vide
		if {$textPCod == ""} {
			.txt_pCode delete 1.0 end
			.lst_lignes_PCode delete 0 end
			.txt_pCode insert end "Compilation échouée\n"
			ouvrir_fichier_et_afficher .console .lbl_titre_PCode "$filename.lst" compteur .lst
        	# descente de l'ascenseur a la fin de l'affichage
        	.console see end
        	puts $pipe_my_loop "clos:\n"
		} else {
    		ouvrir_fichier_et_afficher .console .lbl_titre_PCode "$filename.lst" compteur .lst
    		ouvrir_fichier_et_afficher .txt_pCode .lbl_titre_PCode "$filename.pcod" nbLignesPCode .lst_lignes_PCode
    		# descente de l'ascenseur a la fin de l'affichage
        	.console see end
        	#pipe de tube d'écriture et lecture de stdin et stdout depuis deux fichiers
			set pipe_my_loop [open "|./pinter" "r+"]
			fconfigure $pipe_my_loop -buffering line
			fileevent $pipe_my_loop readable readPipe
        	puts $pipe_my_loop "open:$filename.pcod\n"
    	}
    }
    .btn_compilation configure -state disabled
}

#procédure de lecture du pipe
proc readPipe {} {
	global pipe_my_loop texteLu
	flush $pipe_my_loop
	#lecture du contenu du pipe
	gets $pipe_my_loop texteLu
	#affichage du texte lu depuis la console, sur la sortie standard (stdout)
	puts "Lu depuis TCL : $texteLu"
	traitementMessages
}

#analyse le programme sans afficher le PCode
proc analyser_programme {} {
	global filename
	global pipe
	if { $filename == "" } {
       .btn_compilation configure -state disabled
       # Affichage d'un message d'erreur dans le cas où le nom du fichier est incorrect
       tk_messageBox -title "Erreur compilation " -icon error -message "Vous n'avez pas ouvert de programme Pascal.\nCompilation impossible."
       return
    } else {
    	enregistrer_fichier
    	exec ./my_pc $filename
    	set compteur 0
    	.txt_pCode delete 1.0 end
		.lst_lignes_PCode delete 0 end
    	ouvrir_fichier_et_afficher .console .lbl_titre_PCode "$filename.lst" compteur .lst
    	# descente de l'ascenseur a la fin de l'affichage
        .console see end
        .btn_compilation configure -state normal
    }
  
	set filePCod [open "$filename.pcod" r]
	set textPCod [read $filePCod]
	#fermeture
	close $filePCod
	#si le PCod est vide
	if {$textPCod == ""} {
		.btn_compilation configure -state disabled
	} 
    
}

proc ouvrir_fichier_et_afficher {widget_text lbl_titre fName nbLignes lstLignes} {
	#ouverture d'un fichier en lecture et affichage d'un message d'erreur le cas échéant
    if [catch {open $fName r} fileid] {
       # Affichage d'un message d'erreur dans le cas où le nom du fichier est incorrect
       tk_messageBox -icon error -message "Impossible d'ouvrir le fichier : \"$filename\":\n$fileid"
       return
    }

	#nettoyage de la liste
	$lstLignes delete 0 end

	#remise à 0 du compteur de lignes
    set nbLignes 0

	#parcourt du fichier et insertion du nombre de lignes dans la liste
	while { [gets $fileid line] >= 0 } {
    	$lstLignes insert end $nbLignes
    	incr nbLignes
	}
	
	#fermeture
	close $fileid
	
	#réouverture 
	set fileid [open $fName r]

    # Nom valide et sauvegarde du fichier
    set filename $fName

	#Ecriture du fichier
    set data [read $fileid]
    close $fileid
    
    # Nettoyage du widget text
    $widget_text delete 1.0 end
    # Insertion du contenu du fichier
    $widget_text insert end $data
    $widget_text insert end "\n"

	# Mise a jour du nom du fichier ouvert
	set_label_chemin $filename $lbl_titre 
}
